package main

/*
	UDP服务器
*/
import (
	"fmt"
	msg "goProtoTest"
	"net"
	"time"

	"github.com/golang/protobuf/proto"
)

var start_time int64

// UDP goroutine 实现并发读取UDP数据
func udpProcess(conn *net.UDPConn) {

	// 最大读取数据大小
	cnt := 0
	data := make([]byte, 100)
	for {
		_, _, err := conn.ReadFromUDP(data)
		if err != nil {
			fmt.Println("failed read udp msg, error: " + err.Error())
		}
		//成功以后反序列化
		template := &msg.MsgReq{}
		proto.Unmarshal(data, template)
		//fmt.Printf("cnt:%d msg:%s\n", template.GetCnt(), template.GetMessage())
		cnt++
		if time.Now().Unix()-start_time >= 10 {
			fmt.Printf("Total cnt in Print： %d,QPS is :%f", cnt, float32(cnt)/10)
			break
		}
	}
}
func main() {
	//绑定udp地址
	udp_addr, err := net.ResolveUDPAddr("udp", "0.0.0.0:8000")
	if err != nil {
		fmt.Println(err.Error())
	}
	//监听请求
	udp_conn, err := net.ListenUDP("udp", udp_addr)
	if err != nil {
		fmt.Println(err.Error())
	}
	start_time = time.Now().Unix()
	go udpProcess(udp_conn)
	defer udp_conn.Close() //defer可以将一个方法延迟到包裹该方法的方法返回时执行,相当于在return前再关闭监听

	for {
		var cmd string //exit退出
		fmt.Println(">")
		fmt.Scanf("%s", cmd)
		if cmd == "exit" {
			break
		}
	}

}
